home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Magazin/MacEasy 32
/
Mac Magazin and MacEasy Magazine CD - Issue 32.iso
/
Multimedia
/
MIDI
/
MidiChaos_15 Folder
/
MidiChaos_1.5
/
Source
/
PresetManager
< prev
next >
Wrap
Text File
|
1993-02-26
|
9KB
|
427 lines
\ Preset Manager for MidiChaos
\ Author: Darren Gibbs Copyright 1990
\ Date: 11/8/90
\
\ MOD: RDG 11/14/90 Added bank load and store.
ANEW TASK-PRESET_MANAGER
OB.OBJLIST PRESET-LISTS
: BUILD.PRESET.LISTS ( -- , create shape to hold presets for each voice )
many: voice-list dup new: preset-lists 0
DO
instantiate ob.shape
dup 100 19 rot new: []
add: preset-lists
LOOP
;
: FREE.PRESET.LISTS ( -- , free preset holders )
many: preset-lists 0
DO
I at: preset-lists dup
free: []
deinstantiate
LOOP
free: preset-lists
;
: GET.VOICE.DATA { voice# | voice -- , dump voice's data to stack }
voice# at: voice-list
dup -> voice get.channel: []
get.#params 0
DO
I voice generator@: [] dup>r
get.p1: []
r@ get.p2: []
r@ get.x: []
r@ get.min: []
r@ get.max: []
r> get.function: []
LOOP
;
: PUT.VOICE.DATA ( 19 data items + voice# ) { | voice -- , stuff data into voice }
at: voice-list -> voice
get.#params 0
DO
2 I - \ count down from two to 0.
voice generator@: [] dup>r
use.function: []
r@ put.max: []
r@ put.min: []
r@ put.x: []
r@ put.p2: []
r> put.p1: []
LOOP
voice put.channel: []
;
OB.NUMERIC.GRID PRESET-SELECTOR
: BUILD.PRESET-SELECTOR ( -- )
300 300 put.wh: preset-selector
1 1 new: preset-selector
0 0 put.min: preset-selector
99 0 put.max: preset-selector
1 put.increment: preset-selector
" Preset " put.title: preset-selector
;
: SAVE.PRESET ( -- )
pause.voices
many: voice-list 0
DO
I at: voice-list get.data: [] \ was the voice on?
IF I get.voice.data \ dump data onto stack
ELSE 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 \ 19 dummy values to keep preset
\ numbers consistant across voices.
THEN
I at: preset-lists dup>r \ get voice's preset list
add: [] \ add new data
r@ many: [] \ now how many elements
1- r> goto: [] \ update end of list
LOOP
0 at: preset-lists where: []
0 put.value: preset-selector \ update preset-selector
unpause.voices
;
: VALID.PRESET? ( preset# -- ? )
0 at: preset-lists where: [] <= \ is current <= end of list
;
: LOAD.PRESET { | preset# -- }
0 get.value: preset-selector
dup -> preset# \ get and save preset
valid.preset?
IF many: voice-list 0 \ for each voice...
DO
preset# 0 I at: preset-lists ed.at: [] \ use first as flag
IF preset# I at: preset-lists get: [] \ dump data onto stack
I put.voice.data \ write it to the voice
I at: voice-list start: [] \ begin playing
ELSE I at: voice-list stop: [] \ turn voice off
THEN
LOOP
THEN
;
: INSERT.PRESET { | preset# -- }
pause.voices
0 get.value: preset-selector
dup -> preset# \ get and save preset
valid.preset?
IF many: voice-list 0
DO
I at: voice-list get.data: [] \ was the voice on?
IF I get.voice.data \ dump data onto stack
ELSE 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 \ 19 dummy values to keep preset
\ numbers consistant across voices.
THEN preset# \ get desired preset location
I at: preset-lists \ get voice's preset list
insert: [] \ insert new data
LOOP
THEN
unpause.voices
;
: DELETE.PRESET { | preset# -- }
0 get.value: preset-selector
dup -> preset# \ get and save preset
valid.preset?
IF many: voice-list 0
DO
preset# I at: preset-lists \ get voice's preset list
remove: [] \ kill it
LOOP
preset# 0 at: preset-lists many: [] = \ was this the last in list
IF 0 get.value: preset-selector
1- 0 put.value: preset-selector \ point to new end of list
THEN
THEN
;
: FIRST.PRESET ( -- )
0 0 put.value: preset-selector \ force control to 0
load.preset
;
: LAST.PRESET ( -- )
0 at: preset-lists many: [] 1- \ get last preset
0 put.value: preset-selector
load.preset
;
: NEXT.PRESET ( -- )
0 get.value: preset-selector \ get current preset
dup 0 at: preset-lists many: [] 1- \ get last preset
<
IF 1+ 0 put.value: preset-selector \ increment
load.preset
ELSE drop \ at 0 so use current
THEN
;
: PREV.PRESET ( -- )
0 get.value: preset-selector \ get current preset
dup 0>
IF 1- 0 put.value: preset-selector \ decrement
load.preset
ELSE drop
THEN
;
: CLEAR.PRESETS ( -- )
many: voice-list 0
DO
I at: preset-lists \ get voice's preset list
dup
clear: [] \ clear preset list
reset: [] \ reset pointer
LOOP
0 0 put.value: preset-selector \ force control to 0
;
OB.CHECK.GRID PRESET-GRID
TEXTROM PRESET-TEXT ," Save " ," Load " ," Insert " ," Delete "
," First " ," Last " ," Next " ," Prev. "
," Clear " ," Unused "
CREATE PRESET-FUNCTIONS
'c save.preset a, 'c load.preset a, 'c insert.preset a, 'c delete.preset a,
'c first.preset a, 'c last.preset a, 'c next.preset a, 'c prev.preset a,
'c clear.presets a, 'c noop a,
: INDEX>PRESET-FUNC ( index -- CFA , get CFA from index. )
preset-functions swap cell* + a@
;
: PRESET.GRID.FUNC { val part# -- }
0 at: preset-lists many: [] 0> \ are there any presets?
part# 0= \ is a save requested?
OR \ if neither case, do nothing
IF part# index>preset-func execute
THEN
0 part# current.object put.value: [] \ turn off button
;
: BUILD.PRESET-GRID ( -- )
475 300 put.wh: preset-grid
2 5 new: preset-grid
'c preset-text put.text.function: preset-grid
" Options " put.title: preset-grid
'c preset.grid.func put.down.function: preset-grid
;
\ Tools for storing and retrieving preset banks on disk.
50 CONSTANT PS-PAD-SIZE
VARIABLE PS-PAD PS-PAD-SIZE ALLOT
VARIABLE PS-INDEX
VARIABLE PS-FILEID
: PS-PUSH ( n -- )
ps-pad ps-index @ + W!
2 ps-index +!
;
: PS-POP ( -- n )
ps-index @ 2 - ps-index !
ps-pad ps-index @ + W@
;
: PS.PUSH.PRESET ( 19items -- )
0 ps-index !
19 0
DO
ps-push
LOOP
;
: PS.POP.PRESET ( -- 19items )
38 ps-index ! \ begin at end of list
19 0
DO
ps-pop
LOOP
;
\ FIle words --------------------------------------------------------------
: $PS.OPEN.VR ( $filename volref -- )
$fopen_vr dup 0=
IF drop abort
ELSE ps-fileid !
THEN
;
chkid BUTT PS-CREATOR
chkid TEXT PS-TYPE
: PS.SET.FILEINFO ( -- , set creator and type )
ps-creator file-creator !
ps-type file-type !
;
: $PS.CREATE ( $filename volref -- , create new file )
ps.set.fileinfo
new $ps.open.vr
;
: PS.READ ( addr #bytes -- , read from open ps file)
ps-fileid @ -rot fread drop \ drop byte count
;
: PS.WRITE ( addr #bytes -- , write to open ps file)
ps-fileid @ -rot fwrite drop \ drop byte count
;
: PS.CLOSE
ps-fileid @ ?dup
IF fclose
0 ps-fileid !
THEN
;
: PS.WRITE.PRESET ( -- )
ps-pad 38 ps.write
;
: PS.READ.PRESET ( -- )
ps-pad 38 ps.read
;
VARIABLE HEADER-PAD
: PS.WRITE.HEADER ( #voices #presets -- , write data to first to bytes )
header-pad 1+ c!
header-pad c!
header-pad 2 ps.write
;
: PS.READ.HEADER ( -- #voices #presets )
header-pad 2 ps.read
header-pad c@ header-pad 1+ c@
;
\ Main code. ------------------------------------------------------------
: $SAVE.PRESET ( preset# list# -- )
at: preset-lists get: [] ps.push.preset
ps.write.preset
;
: $LOAD.PRESET { preset# list# -- }
ps.read.preset
ps.pop.preset
list# at: preset-lists add: []
;
: (SAVE.BANK) { #voices #presets -- }
#voices #presets ps.write.header
#voices 0
DO
#presets 0
DO
I J $save.preset
LOOP
LOOP
;
: SAVE.BANK ( -- , save entire set of presets to disk )
" " 100 100 " " sfputfile
IF $ps.create
many: voice-list 0 at: preset-lists many: []
(save.bank)
ps.close
THEN
;
: NEW.VOICES ( #voices -- )
dup many: voice-list = NOT
IF term.main.screen
free.voices
free.preset.lists
make.voices
init.main.screen
build.preset.lists
ELSE DROP clear.presets
THEN
;
: (LOAD.BANK) { | #presets #voices -- }
ps.read.header -> #presets -> #voices
#voices new.voices
#voices 0
DO
#presets 0
DO
I J $load.preset
LOOP
#presets 1- \ update end of list
I at: preset-lists goto: []
LOOP
;
: LOAD.BANK ( -- , save entire set of presets to disk )
sfgetfile
IF
$ps.open.vr
(load.bank)
ps.close
THEN
;
OB.CHECK.GRID BANK-GRID
TEXTROM BANK-TEXT ," Save Bank " ," Load Bank "
: BANK.GRID.FUNC { value part# -- }
pause.voices
part#
CASE
0 OF save.bank ENDOF
1 OF load.bank ENDOF
ENDCASE
0 part# put.value: bank-grid
unpause.voices
;
: BUILD.BANK-GRID ( -- )
650 300 put.wh: bank-grid
1 2 new: bank-grid
'c bank-text put.text.function: bank-grid
'c bank.grid.func put.down.function: bank-grid
;
OB.SCREEN PRESET-SCREEN
: BUILD.PRESET.SCREEN ( -- )
" Preset Management " put.title: preset-screen
build.preset-grid
build.preset-selector
build.bank-grid
3 3 new: preset-screen
preset-grid 500 700 add: preset-screen
preset-selector 1700 700 add: preset-screen
bank-grid 1700 1600 add: preset-screen
;
: INIT.PRESET.SCREEN ( -- )
build.preset.screen
build.preset.lists
;
: TERM.PRESET.SCREEN ( -- )
freeall: preset-screen
free: preset-screen
free.preset.lists
;